/*
 *  Copyright (C) 2012 Компания ВИТ. web: http://diasled.ru Е-mail:  vit@diasled.ru
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */
package ru.apertum.diasled.redactor;

import ru.apertum.diasled.cfg.Outline;
import ru.apertum.diasled.cfg.MyPoint;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Comparator;
import java.util.LinkedList;

/**
 * Сенсор из конфигурации. У него  есть все необходимые параметры и координаты для отрисовки.
 * @author Evgeniy Egorov
 */
public final class SensorDraw extends MyPoint implements Comparator<SensorDraw>, Comparable<SensorDraw> {

    /* Удалено за ненужностью
     * Номер байта в массиве байт пришедшем от сканера
     * Номерация с 0
     */
    /*
    @Expose
    @SerializedName("phisical")
    private int phisicalNum = 0;
    
    public int getPhisicalNum() {
    return phisicalNum;
    }
    
    public void setPhisicalNum(int phisicalNum) {
    this.phisicalNum = phisicalNum;
    }
     * 
     */
    /**
     * Логический номер. Номер по которому определяется позиция байта для этого сенсора в массиве байт в кадре прешедшем от сканера.
     * Номерация с 0
     */
    @Expose
    @SerializedName("logical")
    private int logicalNum = 0;

    public int getLogicalNum() {
        return logicalNum;
    }

    public void setLogicalNum(int logicalNum) {
        this.logicalNum = logicalNum;
    }
    /**
     * таблица тарировки (255 значений давления на каждый датчик)
     */
    @Expose
    @SerializedName("tart_data")
    private LinkedList<Integer> tarData = new LinkedList<>();

    public LinkedList<Integer> getTarData() {
        return tarData;
    }

    public void setTarData(LinkedList<Integer> tarData) {
        if (tarData == null) {
            tarData = new LinkedList<>();
            for (int i = 0; i < 256; i++) {
                tarData.add((int) 0);
            }
        }
        for (int i = tarData.size(); i < 256; i++) {
            tarData.add((int) 0);
        }
        this.tarData = tarData;
    }
    /**
     * таблица зон и коэффициентов
     */
    @Expose
    @SerializedName("zone")
    private LinkedList<CZone> zone = new LinkedList<>();

    public LinkedList<CZone> getZone() {
        if (zone.isEmpty()) {
            zone.add(new CZone());
        }
        return zone;
    }

    public void setZone(LinkedList<CZone> zone) {
        if (zone.isEmpty()) {
            zone.add(new CZone());
        }
        this.zone = zone;
    }

    public SensorDraw(int x, int y) {
        super(x, y);
    }

    public SensorDraw(Point p) {
        super(p);
    }

    public SensorDraw() {
    }

    @Override
    public String toString() {
        return "Сенсор " + super.toString();
    }

    @Override
    public int compare(SensorDraw o1, SensorDraw o2) {
        if (!o1.equals(o2)) {
            return -1;
        }
        return 0;
    }

    @Override
    public int compareTo(SensorDraw o) {
        if (!equals(o)) {
            return -1;
        }
        return 0;
    }

    /**
     * нарисовать сенсор
     * @param g на этой конве происходит отрисовка
     */
    public void draw(Graphics g) {
        g.drawOval(x - RAD, y - RAD, RAD * 2, RAD * 2);
        //g.drawString("" + phisicalNum, x - RAD / 3 * 2 + 2, y - RAD / 4);
        g.drawString("" + logicalNum, x - RAD / 5 * 4, y + RAD / 3 * 1);
    }
    /**
     * радиус окружности для отрисовки серсора на плоскости
     */
    final static public int RAD = 11;
    /**
     * Это принадлежностьк контуру. Когда конфигурация загрузится, то все сенсоры отсортируются по принадлежности к контуру.
     * Это поле нужно только как быстрый поиск контура к которому принадлежит сенсор.
     */
    private Outline outline = null;

    public Outline getOutline() {
        return outline;
    }

    public void setOutline(Outline outline) {
        this.outline = outline;
    }
    /**
     * Давление на датчике. Нужен только для отрисовки кадров при отображении обследования.
     * Кадр читается из БД и данные сюда заносятся. 
     * А т.к. эти все сенсоры в конфигурации по которым происходит отрисовка, то все веса быдут доступны при отрисовке.
     */
    private int value = 0;

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}
